@actions/core
Core functions for setting results, logging, registering secrets and exporting variables across actions
Usage
Import the package
const core = require('@actions/core');
import * as core from '@actions/core';
Inputs/Outputs
Action inputs can be read with getInput
which returns a string
or getBooleanInput
which parses a boolean based on the yaml 1.2 specification. If required
set to be false, the input should have a default value in action.yml
.
Outputs can be set with setOutput
which makes them available to be mapped into inputs of other actions to ensure they are decoupled.
const myInput = core.getInput('inputName', { required: true });
const myBooleanInput = core.getBooleanInput('booleanInputName', { required: true });
const myMultilineInput = core.getMultilineInput('multilineInputName', { required: true });
core.setOutput('outputKey', 'outputVal');
Exporting variables
Since each step runs in a separate process, you can use exportVariable
to add it to this step and future steps environment blocks.
core.exportVariable('envVar', 'Val');
Setting a secret
Setting a secret registers the secret with the runner to ensure it is masked in logs.
core.setSecret('myPassword');
PATH Manipulation
To make a tool's path available in the path for the remainder of the job (without altering the machine or containers state), use addPath
. The runner will prepend the path given to the jobs PATH.
core.addPath('/path/to/mytool');
Exit codes
You should use this library to set the failing exit code for your action. If status is not set and the script runs to completion, that will lead to a success.
const core = require('@actions/core');
try {
}
catch (err) {
core.setFailed(`Action failed with error ${err}`);
}
Note that setNeutral
is not yet implemented in actions V2 but equivalent functionality is being planned.
Logging
Finally, this library provides some utilities for logging. Note that debug logging is hidden from the logs by default. This behavior can be toggled by enabling the Step Debug Logs.
const core = require('@actions/core');
const myInput = core.getInput('input');
try {
core.debug('Inside try block');
if (!myInput) {
core.warning('myInput was not set');
}
if (core.isDebug()) {
} else {
}
core.info('Output to the actions build log')
core.notice('This is a message that will also emit an annotation')
}
catch (err) {
core.error(`Error ${err}, action may still succeed though`);
}
This library can also wrap chunks of output in foldable groups.
const core = require('@actions/core')
core.startGroup('Do some function')
doSomeFunction()
core.endGroup()
const result = await core.group('Do something async', async () => {
const response = await doSomeHTTPRequest()
return response
})
Annotations
This library has 3 methods that will produce annotations.
core.error('This is a bad error, action may still succeed though.')
core.warning('Something went wrong, but it\'s not bad enough to fail the build.')
core.notice('Something happened that you might want to know about.')
These will surface to the UI in the Actions page and on Pull Requests. They look something like this:
These annotations can also be attached to particular lines and columns of your source files to show exactly where a problem is occuring.
These options are:
export interface AnnotationProperties {
title?: string
file?: string
startLine?: number
endLine?: number
startColumn?: number
endColumn?: number
}
Styling output
Colored output is supported in the Action logs via standard ANSI escape codes. 3/4 bit, 8 bit and 24 bit colors are all supported.
Foreground colors:
core.info('\u001b[35mThis foreground will be magenta')
core.info('\u001b[38;5;6mThis foreground will be cyan')
core.info('\u001b[38;2;255;0;0mThis foreground will be bright red')
Background colors:
core.info('\u001b[43mThis background will be yellow');
core.info('\u001b[48;5;6mThis background will be cyan')
core.info('\u001b[48;2;255;0;0mThis background will be bright red')
Special styles:
core.info('\u001b[1mBold text')
core.info('\u001b[3mItalic text')
core.info('\u001b[4mUnderlined text')
ANSI escape codes can be combined with one another:
core.info('\u001b[31;46mRed foreground with a cyan background and \u001b[1mbold text at the end');
Note: Escape codes reset at the start of each line
core.info('\u001b[35mThis foreground will be magenta')
core.info('This foreground will reset to the default')
Manually typing escape codes can be a little difficult, but you can use third party modules such as ansi-styles.
const style = require('ansi-styles');
core.info(style.color.ansi16m.hex('#abcdef') + 'Hello world!')
Action state
You can use this library to save state and get state for sharing information between a given wrapper action:
action.yml:
name: 'Wrapper action sample'
inputs:
name:
default: 'GitHub'
runs:
using: 'node12'
main: 'main.js'
post: 'cleanup.js'
In action's main.js
:
const core = require('@actions/core');
core.saveState("pidToKill", 12345);
In action's cleanup.js
:
const core = require('@actions/core');
var pid = core.getState("pidToKill");
process.kill(pid);
OIDC Token
You can use these methods to interact with the GitHub OIDC provider and get a JWT ID token which would help to get access token from third party cloud providers.
Method Name: getIDToken()
Inputs
audience : optional
Outputs
A JWT ID Token
In action's main.ts
:
const core = require('@actions/core');
async function getIDTokenAction(): Promise<void> {
const audience = core.getInput('audience', {required: false})
const id_token1 = await core.getIDToken()
const id_token2 = await core.getIDToken(audience)
}
getIDTokenAction()
In action's actions.yml
:
name: 'GetIDToken'
description: 'Get ID token from Github OIDC provider'
inputs:
audience:
description: 'Audience for which the ID token is intended for'
required: false
outputs:
id_token1:
description: 'ID token obtained from OIDC provider'
id_token2:
description: 'ID token obtained from OIDC provider'
runs:
using: 'node12'
main: 'dist/index.js'
Filesystem path helpers
You can use these methods to manipulate file paths across operating systems.
The toPosixPath
function converts input paths to Posix-style (Linux) paths.
The toWin32Path
function converts input paths to Windows-style paths. These
functions work independently of the underlying runner operating system.
toPosixPath('\\foo\\bar')
toWin32Path('/foo/bar')
The toPlatformPath
function converts input paths to the expected value on the runner's operating system.
toPlatformPath('/foo/bar')
toPlatformPath('\\foo\\bar')
Platform helper
Provides shorthands for getting information about platform action is running on.
import { platform } from '@actions/core'
platform.platform
platform.arch
platform.isWindows
platform.isMacOS
platform.isLinux
const {
name,
version,
} = await platform.getDetails()
Populating job summary
These methods can be used to populate a job summary. A job summary is a buffer that can be added to throughout your job via core.summary
methods.
Job summaries when complete must be written to the summary buffer file via the core.summary.write()
method.
All methods except addRaw()
utilize the addRaw()
method to append to the buffer, followed by an EOL using the addEOL()
method.
core.summary.addRaw('Some content here :speech_balloon:', true)
core.summary.addEOL()
core.summary.addCodeBlock('console.log(\'hello world\')', 'javascript')
core.summary.addList(['item1','item2','item3'], true)
core.summary.addDetails('Label', 'Some detail that will be collapsed')
core.summary.addImage('example.png', 'alt description of img', {width: '100', height: '100'})
core.summary.addHeading('My Heading', '2')
core.summary.addSeparator()
core.summary.addBreak()
core.summary.addQuote('To be or not to be', 'Shakespeare')
core.summary.addLink('click here', 'https://github.com')
Tables are added using the addTable()
method, and an array of SummaryTableRow
.
export type SummaryTableRow = (SummaryTableCell | string)[]
export interface SummaryTableCell {
data: string
header?: boolean
colspan?: string
rowspan?: string
}
For example
const tableData = [
{data: 'Header1', header: true},
{data: 'Header2', header: true},
{data: 'Header3', header: true},
{data: 'MyData1'},
{data: 'MyData2'},
{data: 'MyData3'}
]
core.summary.addTable([tableData])
In addition to job summary content, there are utility functions for interfacing with the buffer.
core.summary.clear()
core.summary.stringify()
core.summary.isEmptyBuffer()
core.summary.emptyBuffer()
core.summary.write({overwrite: true})